跳到主要内容

Maven 的生命周期与插件

参考资料 Maven 教程

9 种生命周期

在 IDEA 里面可以直接控制

默认会打包到 target 目录下

clean

当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:

  • pre-clean:执行一些需要在clean之前完成的工作
  • clean:移除所有上一次构建生成的文件
  • post-clean:执行一些需要在clean之后立刻完成的工作

不过一般还是直接使用 clean

它会在进行真正的构建之前进行一些清理工作,移除所有上一次构建生成的文件。执行该命令会删除项目路径下的 target 文件夹,但是不会删除本地的 Maven 仓库已经生成的 jar 文件。

validate

验证,验证工程是否正确,所需的信息是否完整。

compile

编译源码,编译生成 class 文件,编译命令,只编译选定的目标,不管之前是否已经编译过,会在你的项目路径下生成一个 target 目录,在该目录中包含一个 classes 文件夹,里面全是生成的 class 文件及字节码文件。

test

单元测试,测试。

package

打包,将工程文件打包为指定的格式,例如 JAR、WAR 等。这个命令会在你的项目路径下一个 target 目录,并且拥有 compile 命令的功能进行编译,同时会在 target 目录下生成项目的 jar/war 文件。如果 a 项目依赖于 b 项目,打包 b 项目时,只会打包到 b 项目下 target 下,编译 a 项目时就会报错,因为找不到所依赖的 b 项目,说明 a 项目在本地仓库是没有找到它所依赖的 b 项目,这时就用到 install 命令了

verify

核实,检查 package 是否有效、符合标准。

install

安装至本地仓库,将包安装至本地仓库,以让其它项目依赖。该命令包含了 package 命令功能,不但会在项目路径下生成 class 文件和 jar 包,同时会在你的本地 Maven 仓库生成 jar 文件,供其他项目使用(如果没有设置过 Maven 本地仓库,一般在用户 /.m2 目录下。如果 a 项目依赖于 b 项目,那么 install b 项目时,会在本地仓库同时生成 pom 文件和 jar 文件,解决了上面打包 package 出错的问题)

build

功能类似 compile,只是只对整个项目进行编译。

deploy

复制到远程仓库

site:站点,生成项目的站点文档

跳过单元测试

默认项目打包时都会先统一执行一遍 test 目录下面的单元测试才能打包,但是可以在打包时直接跳过这个单元测试

只需点击 IDEA 里面的这个闪电标志

build 和 compile 的区别

Compile:只编译选定的目标,不管之前是否已经编译过。

Build:是对整个工程进行彻底的重新编译,而不管是否已经编译过。Build 过程往往会生成发布包,这个具体要看对 IDE 的配置了,Build 在实际中应用很少,因为开发时候基本上不用,发布生产时候一般都用 ANT 等工具来发布。Build 因为要全部编译,还要执行打包等额外工作,因此时间较长。

依赖的作用域

参考资料 Maven 中的 dependency 的 scope 作用域详解

  1. test 范围指的是测试范围有效,在编译和打包时都不会使用这个依赖
  2. compile 范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
  3. provided 依赖:在编译和测试的过程有效,最后生成 war 包时不会加入,诸如:servlet-api,因为 servlet-api,tomcat 等 web 服务器已经存在了,如果再打包会冲突
  4. runtime 在运行的时候依赖,在编译的时候不依赖

例如:

<!-- scope 用 provided 就行,只是为了编译通过,tomcat 会自带。 -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>

默认的依赖范围是 compile

插件的工作原理

参考自--菜鸟教程

Maven 有以下三个标准的生命周期:

  • clean:项目清理的处理
  • default(或 build):项目部署的处理
  • site:项目站点文档创建的处理

每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。

我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是由 maven-clean-plugin 来实现的。

所以说 Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。

Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 代码单元测试
  • 创建工程文档
  • 创建工程报告
类型描述
Build plugins在构建时执行,并在 pom.xml 的 元素中配置。
Reporting plugins在网站生成过程中执行,并在 pom.xml 的 元素中配置。

下面是一些常用插件的列表:

插件描述
clean构建之后清理目标文件。删除目标目录。
compiler编译 Java 源文件。
surefile运行 JUnit 单元测试。创建测试报告。
jar从当前工程中构建 JAR 文件。
war从当前工程中构建 WAR 文件。
javadoc为工程生成 Javadoc。
antrun从构建过程的任意一个阶段中运行一个 ant 任务的集合。

spring-boot-maven-plugin 插件

参考资料 springboot 打包插件spring-boot-maven-plugin打包机制及内部结构分析

SpringBoot 框架提供了一套自己的打包机制,是通过 spring-boot-maven-plugin 插件来实现的。

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>

在父类总工程的 pom.xml 里面加上这个插件后就能在 Maven 插件面板看到它的这些插件功能了

功能说明:

  • build-info:生成项目的构建信息文件 build-info.properties
  • repackage:这个是默认 goal,在 mvn package 执行之后,这个命令再次打包生成可执行的 jar,同时将 mvn package 生成的 jar 重命名为 *.origin
  • run:这个可以用来运行 Spring Boot 应用
  • start:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理
  • stop:这个在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理

maven打包之war包

因为maven实际上是由一个个不同的插件构成的,所以一般要对war进行配置的话,参考如下

<!-- 首先在pom文件里把包改成war包 -->
<packaging>war</packaging>


<!-- maven的web项目默认的webroot是在src\main\webapp。如果在此目录下找不到web.xml就抛出以上的异常。 -->
<!-- 如果需要自定义,则更改以下的编译配置(实际上打包成war是用的插件,所以配置相应插件就好了) -->
<build>
<finalName>web-app-name</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<!--指定web.xml的位置-->
<webXml>WebContent\WEB-INF\web.xml</webXml>
<!--指定jsp等文件所在位置-->
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>